iT邦幫忙

2024 iThome 鐵人賽

DAY 7
2
Python

從概念到應用:Python實戰開發學習之旅系列 第 7

[Day6] 流程控制的另一個好夥伴(迴圈) - 迴圈不會停,電腦又當機

  • 分享至 

  • xImage
  •  

本文重點

今天要介紹的是流程控制裡面另一類很重要的夥伴迴圈
迴圈在程式設計的撰寫中,我們可以透過他重複、循環的特性去幫助我們處理掉
我們需要使用電腦處理的routine的工作、日常習慣紀錄、搜尋或查找相關的動作。

但是在寫迴圈時可能會因為沒寫好中斷的語法或是因不明錯誤而導致電腦當機
https://ithelp.ithome.com.tw/upload/images/20240921/20121052kYZ2NAi2rs.jpg

學習重點有四個

  1. for 迴圈介紹
  2. while 的介紹
  3. 迴圈使用的示範
  4. 迴圈在流程圖上的展示

https://ithelp.ithome.com.tw/upload/images/20240921/20121052VRjgtCfijo.png

我的教學一樣會以邏輯跟思考的方式帶大家看待程式的設計跟思維模式
所以我會傾向於

  1. 介紹基本語法
  2. 有流程圖畫圖 (培養思維)
  3. 反問自己或團隊(這樣好?好在哪?能不能更好?缺點是什麼?未來可以怎麼改?)
  4. 小tips(如果有想到的小tips或記憶點也會從中分享)
    不希望大家一開始就把整個文件背熟在開始實作

除了打擊信心以外也會有學習的疲倦感~!/images/emoticon/emoticon06.gif

當然讀完整官方文件跟良好的演算法&資料結構知識是好的程式設計師培養的能力~!
如果有完整性的教學或是老師帶的話~就不一樣了
還是要看當下的學習環境跟自己的學習規劃而定喔~!!

Part1 - for迴圈介紹

基本介紹

  • 概念

for 迴圈用於遍歷可疊代的物件,如列表、字典、字串等。它會依次取出序列中的每個元素並執行指定的程式碼。

  • 限制

Python 的 for 迴圈必須使用 in 關鍵字來遍歷可疊代的物件,如列表、字典或字串等,而不是像某些語言那樣使用起始值、條件和結束值的格式。

補充

  • 1.可迭代物件
    可迭代物件可以是列表、元組、字串、字典或 range 物件等 = > 白話文就是有想像一串的資料組

  • 2.元素
    每次循環,從可迭代物件中依次取出一個 元素

For迴圈武功第一式 - 列表 (List)

numbers = [1, 2, 3, 4, 5]
for num in numbers:
    print(num)

有了前面的說明,我們就可以知道如果有一個陣列資料是數字1~5
我想要把每個數字印出來
這時候就可以使用 for 來把每個元素印出來(num 就是每一個列表的元素)

列表元素是程式最常用來做迴圈的資料型態
因為我們很常需要把陣列裡面的資料讀取後,再進行操作或修改來改變~!!
舉例子:

  1. 每天自動形成的動作(透過把日期當作陣列塞進去,在讀出來進行操作)
  2. 如果你的菜單價錢是新台幣,要變成美金菜單。 => 如果要把陣列讀取出來在乘上美金匯率在換回來

For迴圈武功第二式 - 元組 (Tuple)

my_tuple = ('apple', 'banana', 'cherry')
for fruit in my_tuple:
    print(fruit)

這個資料型態也可以幫助我們快速查找不重複的資料型態
比如說:

  1. 我要找菜單有沒有apple就可以搭配if else尋找~

For迴圈武功第三式 - 字串 (String)

my_string = "Python"
for char in my_string:
    print(char)

For迴圈武功第四式 - 字典 (Dictionary)

my_dict = {'name': 'Alice', 'age': 25, 'city': 'New York'}
for key, value in my_dict.items():
    print(f"{key}: {value}")

** for 迴圈用於遍歷字典中的鍵值對,使用 items() 方法來同時取得鍵和值**

這個也是很常用的資料型態
如果你有一包資料,我們要快速查找是否有要的資料

For迴圈武功第五式 - range() 函數

for num in range(1, 6):
    print(num)

說明: range() 函數生成一個數字序列,這裡的 for 迴圈遍歷從 1 到 5 的數字,並將其依次打印出來。

實戰範例 - 檢查列表偶數根奇數並且做不同處理(用List實作)

一樣我們會根據軟體設計原則來定義目標

Step 1 需求分析
我們這邊就直接簡化了~
下方numbers列表示亂數產生的List
numbers = [15, 26, 37, 48, 59, 60, 71, 82, 93, 104]
我們的目標是: 要讀取List裡面的每個元素,並且如果是偶數要print偶數反之則印出奇數。

Step2 設計流程概念
1.最開始,定義了一個包含 10 個數字的列表 numbers。
2.使用 for 迴圈來逐一迭代列表中的每個數字。
3.在每次迭代中,通過條件 if number % 2 == 0 來檢查當前數字是否是偶數。
4.如果條件為 True,則打印出「是偶數」;如果條件為 False,則打印出「是奇數」。
5.else 部分處理奇數的情況。

來畫看看流程圖吧~!!
https://ithelp.ithome.com.tw/upload/images/20240921/201210525T6xFMSCYK.png

註記: 流程圖中,迴圈會把流程反覆導向回去到條件結束為止

Step3 實作程式

# 定義一個數字列表
numbers = [15, 26, 37, 48, 59, 60, 71, 82, 93, 104]

# 迭代列表中的每個數字
for number in numbers:
    if number % 2 == 0:
        print(f"{number} 是偶數")
    else:
        print(f"{number} 是奇數")

這邊我們可以看到程式碼是
把列表numbers中每個數字取名叫做number抓出來
在依照我們前面交的if-else概念去抓出來做運算
如果%2餘數為0就是偶數那我就印出數字跟後面的文字。

心得分享
大家有沒有發現
雖然我們用肉眼看起來很簡單~
步驟跟程式碼卻變多了

其實我們在看這些程式的時候
要去考量的事情很多
避免電腦錯誤或執行停步下來當機了。

實戰範例 - 列出六都的溫度(Dict)

我們再多帶一個範例是用dict來實踐的
來我們繼續往下看~

Step1-需求
1.我這邊定義六都(台北、新北、桃園、台中、台南、高雄)
2.每個城市都有各自的溫度
3.我需要報每個城市的溫度列表

Step2- 設計程式邏輯
1.定義一個字典其中鍵是六都的名稱,值是對應的溫度。
2.使用 for 迴圈搭配 .items() 方法來遍歷字典,city 是城市名稱,temperature 是對應的溫度。
3.每次迭代時,使用 print() 函數列出每個城市及其溫度。

https://ithelp.ithome.com.tw/upload/images/20240921/20121052eMNLP0Whpb.png

Step3-實作程式

# 定義六都及其當前溫度的字典
cities_temperatures = {
    "台北": 30,
    "新北": 28,
    "桃園": 27,
    "台中": 29,
    "台南": 31,
    "高雄": 32
}

# 使用 for 迴圈遍歷每個城市及其溫度
for city, temperature in cities_temperatures.items():
    print(f"{city} 的溫度是 {temperature} 度")

tips
如果你的資料是Dict型態,你使用.item()的方法串聯在這個變數後面,我們就可以使用兩個參數值
例如: 我的key是city(自己命名) , value是temperature(也是自己命名)

補充
這邊程式的說明比較簡單,不過各位也可以看到
如果是List的情況以及Dict的情況資料要怎麼處理了
/images/emoticon/emoticon01.gif

其他的程式語言大部分都是這樣寫的,下面是C的寫法

for (int i = 0; i < n; i++) {
    // 執行的程式碼
}

這種語法包含了:

  • 起始值(如 int i = 0)
  • 條件(如 i < n)
  • 增量(如 i++) => 這個就是每次執行完,次數會自動增加一次,比如說第0次跑完會變1次

因此,Python 的 for 迴圈確實需要使用 in 關鍵字,而這使得它在設計上與許多其他程式語言不同。這種設計選擇旨在提高程式碼的可讀性和簡潔性

Part2 - while迴圈介紹

基本概念介紹

  • 概念
    while 迴圈根據條件執行,當條件為真時,持續執行指定的程式碼區塊。

  • 重點

  1. 當條件式True的時候會一直執行
  2. 如果沒有跳出或終止的的條件很容易導致系統當機

範例

這邊我們透過簡單的範例來學習while的使用吧

1.計數器程式

代表原本數量是0,但是會把每次累加之後再印出來。

count = 0
while count < 5:
    print(count)
    count += 1

2.輸入遊戲

Step1需求
大家一定有遇過程式
你再輸入某些文字的時候
他會根據你的文字做動作
那麼有觸發exit或是離開這些條件才會讓程式強制終止或結束
那麼我今天想要寫一個程式是
1.讓user輸入任意文字
2.輸入的文字要print出來
3.如果輸入exit會結束程式

Step2設計邏輯

根據需求
1.首先我們先建立一個空字串
2.當user輸入文字(使用input的方法),我們要把空字串的變數變成輸入的文字
3.如果user輸入exit就跳出程式,否則就繼續

https://ithelp.ithome.com.tw/upload/images/20240921/20121052gkVGdUynWl.png

Step3實作

user_input = ""
while user_input != "exit":
    user_input = input("請輸入指令 (輸入 'exit' 結束):")
    print(f"你輸入了: {user_input}")

執行結果非常順利,如下圖
https://ithelp.ithome.com.tw/upload/images/20240921/201210521AOhAYQffh.png

放在迴圈外的意外驚喜!? 非常重要的思考-可能會造成程式錯誤或系統當機
這次的程式比較簡單
但是我要特別講的是大家有沒有想過
如果我的
user_input = input("請輸入指令 (輸入 'exit' 結束):")
放在while迴圈會造成什麼情形?

https://ithelp.ithome.com.tw/upload/images/20240921/201210524HC9g51f9k.png

新手的思維可能會想成
既然輸入
我應該可以把輸入提示跟輸入這動作放外面吧?
這樣while判斷成功就可以印出並離開程式了~

但大家有沒有想過
成功的case可以跳出沒錯
失敗的case如果....你輸入了exit以外的文字...可想而知。因為他印出來了,但是沒有達到exit的條件

複習一下條件是(如果輸入文字不等於exit就會一直循環,也就是....你永遠都達成條件 -> 瘋狂執行)
這也是為什麼我的流程圖會把輸入包進去這樣畫
是不是很有趣呢!!!!
/images/emoticon/emoticon01.gif

終止方法
這時候如果你是使用command line環境下而不是被其他工程師包裝好的網頁或app程式你可以再命令提示字元底下按crtl+c結束

總結

今天學會了使用for跟while的流程控制
但是我沒有講到break跟contune的兩個方法~
我想要把這個留往後的範例來說明
其實今天想給大家的觀念就是基礎應用流程拆解
至於中斷跟跳出
放在後面是不會想讓大家在今天就接觸到~

今天學到了
1.for的5種資料型態的遍歷跟讀取資料操作的過程
2.while迴圈的條件式讓程式自動
3.使用了流程圖拆解步驟解析程式過程
4.滿滿的雷點分享~(放在迴圈外的意外驚喜!?)

使用迴圈的優缺點總表如下

優點 缺點
簡化程式碼 可能導致無窮迴圈
減少重複代碼,讓程式碼更簡潔易讀。 如果條件不正確,可能會造成程式無法終止。
靈活性高 性能影響
可以根據不同條件和資料結構進行調整。 大量迴圈可能影響程式執行速度。
易於維護和擴展 錯誤處理複雜
增加或修改功能時,通常只需調整迴圈內的程式碼。 需要注意邊界條件和例外情況,增加錯誤風險。
適合批量處理 可讀性下降
能夠有效地處理大量資料或重複任務。 過度嵌套的迴圈可能使程式碼難以理解。

大家可以看到
雖然迴圈幫助我們處理掉很多重複型的功能
可是如果用得不好反而會導致錯誤或拖累效能喔!/images/emoticon/emoticon06.gif

** for/while使用情境與優缺點比較 **

  1. 使用情境
迴圈類型 使用情境
for 用於遍歷可疊代的物件(如列表、字典、字串等)。適合已知迭代次數的情況。
while 用於根據條件執行,適合不確定迭代次數的情況,例如等待用戶輸入或處理動態資料。
  1. 條件
迴圈類型 條件
for 通常使用 in 關鍵字來遍歷序列或範圍。
while 根據布林條件持續執行,直到條件不再成立。
  1. 優缺點比較
優點 缺點
for
簡潔明瞭,適合遍歷序列。 無法直接控制迭代次數,需依賴可疊代對象的長度。
易於使用,特別是在處理固定範圍或集合時。 當需要根據複雜條件進行控制時,可能不夠靈活。
while
可以根據複雜條件進行控制,靈活性高。 如果條件不正確,可能導致無窮迴圈。
適合不確定迭代次數的情況,如等待用戶輸入。 需要手動管理計數器或條件變量,可能增加錯誤風險。

上一篇
[Day5] 複習流程控制 - if else 的思路 跟 軟體設計流程分享
下一篇
[Day7] 脫離第一周新手村,邁向進階程式工程師 - Python新手畢業小型應用專案
系列文
從概念到應用:Python實戰開發學習之旅31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言